package com.zenithmind.chat.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 群组成员角色枚举 - 遵循开闭原则
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
public enum MemberRole {
    
    /**
     * 群主
     */
    OWNER(1, "群主", "owner"),
    
    /**
     * 管理员
     */
    ADMIN(2, "管理员", "admin"),
    
    /**
     * 普通成员
     */
    MEMBER(3, "普通成员", "member"),
    
    /**
     * 访客
     */
    GUEST(4, "访客", "guest");

    /**
     * 角色码 - 用于数据库存储
     */
    @EnumValue
    @JsonValue
    private final Integer code;

    /**
     * 角色名称
     */
    private final String name;

    /**
     * 角色标识
     */
    private final String identifier;

    /**
     * 构造函数
     */
    MemberRole(Integer code, String name, String identifier) {
        this.code = code;
        this.name = name;
        this.identifier = identifier;
    }

    /**
     * 根据角色码获取枚举
     * 
     * @param code 角色码
     * @return 对应的枚举值
     */
    public static MemberRole fromCode(Integer code) {
        if (code == null) {
            return MEMBER;
        }
        
        for (MemberRole role : values()) {
            if (role.getCode().equals(code)) {
                return role;
            }
        }
        
        throw new IllegalArgumentException("未知的成员角色码: " + code);
    }

    /**
     * 根据标识获取枚举
     * 
     * @param identifier 角色标识
     * @return 对应的枚举值
     */
    public static MemberRole fromIdentifier(String identifier) {
        if (identifier == null || identifier.trim().isEmpty()) {
            return MEMBER;
        }
        
        for (MemberRole role : values()) {
            if (role.getIdentifier().equals(identifier)) {
                return role;
            }
        }
        
        return MEMBER;
    }

    /**
     * 检查是否为群主
     * 
     * @return 是否为群主
     */
    public boolean isOwner() {
        return this == OWNER;
    }

    /**
     * 检查是否为管理员
     * 
     * @return 是否为管理员
     */
    public boolean isAdmin() {
        return this == ADMIN;
    }

    /**
     * 检查是否为普通成员
     * 
     * @return 是否为普通成员
     */
    public boolean isMember() {
        return this == MEMBER;
    }

    /**
     * 检查是否为访客
     * 
     * @return 是否为访客
     */
    public boolean isGuest() {
        return this == GUEST;
    }

    /**
     * 检查是否有管理权限
     * 
     * @return 是否有管理权限
     */
    public boolean hasManagePermission() {
        return this == OWNER || this == ADMIN;
    }

    /**
     * 检查是否可以发言
     * 
     * @return 是否可以发言
     */
    public boolean canSpeak() {
        return this != GUEST;
    }
}
